package com.tina.service.impl;

import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tina.entity.TiUsers;
import com.tina.entity.TiUsersRoleRef;
import com.tina.mapper.TiUsersMapper;
import com.tina.mapper.TiUsersRoleRefMapper;
import com.tina.service.TiUsersService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tina.util.RedisUtil;
import com.tina.util.SecurityUtils;
import com.tina.util.SystemUtils;
import com.tina.util.TimeUtitl;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 * 用户服务实现类
 * </p>
 *
 * @author PIGS
 * @since 2020-06-05
 */
@Service
@Transactional
public class TiUsersServiceImpl extends ServiceImpl<TiUsersMapper, TiUsers> implements TiUsersService {
    @Autowired
    private TiUsersMapper tiUsersMapper;

    private Logger logger = LoggerFactory.getLogger(TiUsersServiceImpl.class);

    @Autowired
    private TiUsersRoleRefMapper tiUsersRoleRefMapper;

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 通过用户名查询用户信息
     *
     * @param userName
     * @return
     */
    @Override
    public TiUsers queryByName(String userName) {
        TiUsers tiUsersList = tiUsersMapper.queryByName(userName);
        if (tiUsersList != null) {
            return tiUsersList;
        }
        return null;
    }

    /**
     * 查询用户并分页
     * 实现类
     *
     * @param page
     * @param tiUsers
     * @return
     */
    @Override
    public IPage<TiUsers> queryUserList(TiUsers tiUsers, Integer page, Integer limit) {
        AbstractWrapper<TiUsers, String, QueryWrapper<TiUsers>> wrapper = new QueryWrapper<>();

        if (tiUsers != null) {
            if (!StringUtils.isEmpty(tiUsers.getUserName())) {
                wrapper.like("user_name", tiUsers.getUserName());
            }

        }
        wrapper.eq("user_state", tiUsers.getUserState());
        wrapper.orderByDesc("user_registration_time");
        Page<TiUsers> iPage = new Page<TiUsers>(page, limit);
        Page<TiUsers> tiUsersPage = tiUsersMapper.selectPage(iPage, wrapper);
        return tiUsersPage;
    }

    /**
     * 添加用户信息实现类
     *
     * @param tiUsers
     * @param roleId
     * @return
     */
    @Override
    public Integer saveUser(TiUsers tiUsers, Integer roleId) throws Exception {
        logger.info("tiUsers={}", tiUsers);

        /**
         * 从redis中查询用户名是否存在
         */
        List<Object> redisGetTiUsersId = redisUtil.lGet("tiUsersId", 0, -1);
        if (redisGetTiUsersId != null && redisGetTiUsersId.size() > 0) {
            logger.info("redisGetTiUsersId={}", redisGetTiUsersId);
            for (Object o : redisGetTiUsersId) {
                TiUsers redisGetTiUser = (TiUsers) redisUtil.get("tiUsers:" + o);
                if (redisGetTiUser != null) {
                    if (redisGetTiUser.getUserName().equals(tiUsers.getUserName())) {
                        logger.info("redisGetTiUser={}", redisGetTiUser);
                        return 101;
                    }
                }
            }
        }

        logger.info("---- redis没有当前的用户名存在，进入mysql查询 ", "----");
        /**
         * 查询数据库中登录名是否存在
         */
        AbstractWrapper wrapper = new QueryWrapper();
        wrapper.eq("user_name", tiUsers.getUserName());
        TiUsers tiUsersByName = tiUsersMapper.selectOne(wrapper);
        if (tiUsersByName != null) {
            logger.info("tiUsersByName={}", tiUsersByName);
            redisUtil.set("tiUsers:" + tiUsersByName.getUserId(), tiUsersByName);
            redisUtil.lSet("tiUsersId", tiUsersByName.getUserId());
            return 101;
        }

        /**
         * 如果数据中的不存在则添加
         */
        String salt = SecurityUtils.randomSalt();
        tiUsers.setSalt(salt);

        String password = SecurityUtils.encryptPassword(tiUsers.getUserPassword(), salt);
        tiUsers.setUserPassword(password);

        /**
         * 头像随机生成
         * 更好的生态化
         */
        String random = "";
        String[] doc = {
                "/static/res/image/headPortrait/1590809782730.jpeg",
                "/static/res/image/headPortrait/1590810016833.jpeg",
                "/static/res/image/headPortrait/1590828467200.jpeg",
                "/static/res/image/headPortrait/1590811290259.jpeg",
                "/static/res/image/headPortrait/1590812062178.jpeg",
                "/static/res/image/headPortrait/1590812303913.jpeg",
                "/static/res/image/headPortrait/1590828367874.jpeg"};
        int index = (int) (Math.random() * doc.length);
        random = doc[index];
        tiUsers.setUserProfilePhoto(random);

        tiUsers.setUserRegistrationTime(TimeUtitl.dateTime());

        /**
         * 格式化当前时间然后获取年龄添加进去
         */
        Integer age = TimeUtitl.getAge(TimeUtitl.parse(tiUsers.getUserBirthday()));
        logger.info("age={}", age);
        if (age == 0) {
            age = 1;
        }
        tiUsers.setUserAge(age);

        Integer insert = tiUsersMapper.insert(tiUsers);
        if (insert > 0) {
            redisUtil.set("tiUsers:" + tiUsers.getUserId(), tiUsers);
            redisUtil.lSet("tiUsersId", tiUsers.getUserId());
            TiUsersRoleRef tiUsersRoleRef = new TiUsersRoleRef();
            tiUsersRoleRef.setRoleId(roleId);
            tiUsersRoleRef.setUsersId(tiUsers.getUserId());
            tiUsersRoleRef.setUsersRoleRefState(0);
            tiUsersRoleRef.setUsersRoleRefUpdateTime(TimeUtitl.dateTime());
            int insert1 = tiUsersRoleRefMapper.insert(tiUsersRoleRef);
            if (insert1 > 0) {
                redisUtil.set("tiUsersRoleRef:" + tiUsers.getUserId(), tiUsersRoleRef);
                return 1;
            }
        }

        return 100;
    }

    /**
     * 修改用户
     *
     * @param tiUsers
     * @param roleId
     * @return
     * @throws Exception
     */
    @Override
    public Integer editUser(TiUsers tiUsers, Integer roleId) throws Exception {

        /**
         * 从mysql中查询数据如果用户名不存在则修改
         * 如果存在并且不与通过id查询的数据相同就返回101
         * 如果当前的用户名与使用id查询的数据用户名相同则修改
         */
        TiUsers selectById = tiUsersMapper.selectById(tiUsers.getUserId());
        AbstractWrapper wrapper = new QueryWrapper<TiUsers>();
        wrapper.eq("user_name", tiUsers.getUserName());
        TiUsers selectOne = tiUsersMapper.selectOne(wrapper);
        if (selectById != null) {
            if (!selectById.getUserName().equals(tiUsers.getUserName())) {
                if (selectOne != null) {
                    return 101;
                }

            }
        }

        /**
         * 格式化当前时间然后获取年龄添加进去
         */
        Integer age = TimeUtitl.getAge(TimeUtitl.parse(tiUsers.getUserBirthday()));
        logger.info("age={}", age);
        if (age == 0) {
            age = 1;
        }
        tiUsers.setUserAge(age);
        if (SystemUtils.isEmpty(tiUsers.getUserPassword())) {
            String salt = SecurityUtils.randomSalt();
            tiUsers.setSalt(salt);
            String password = SecurityUtils.encryptPassword(tiUsers.getUserPassword(), salt);
            tiUsers.setUserPassword(password);
        } else {
            tiUsers.setUserPassword(null);
        }

        Integer updateById = tiUsersMapper.updateById(tiUsers);
        logger.info("updateById={}", updateById);

        TiUsersRoleRef tiUsersRoleRef = new TiUsersRoleRef();
        tiUsersRoleRef.setRoleId(roleId);
        tiUsersRoleRef.setUsersId(tiUsers.getUserId());

        Integer updateRole = tiUsersRoleRefMapper.updateById(tiUsersRoleRef);
        logger.info("updateRole={}", updateRole);

        if (updateById > 0 && updateRole > 0) {

            redisUtil.del("tiUsers:" + tiUsers.getUserId());
            redisUtil.del("tiUsersRoleRef:" + tiUsers.getUserId());
            return 1;
        }

        return 0;
    }

    /**
     * 修改当前登录用户信息
     * @param tiUsers
     * @param roleId
     * @return
     * @throws Exception
     */
    @Override
    public Integer editThisLoginUser(TiUsers tiUsers, Integer roleId) throws Exception {
        /**
         * 从mysql中查询数据如果用户名不存在则修改
         * 如果存在并且不与通过id查询的数据相同就返回101
         * 如果当前的用户名与使用id查询的数据用户名相同则修改
         */
        TiUsers selectById = tiUsersMapper.selectById(tiUsers.getUserId());
        AbstractWrapper wrapper = new QueryWrapper<TiUsers>();
        wrapper.eq("user_name", tiUsers.getUserName());
        TiUsers selectOne = tiUsersMapper.selectOne(wrapper);
        if (selectById != null) {
            if (!selectById.getUserName().equals(tiUsers.getUserName())) {
                if (selectOne != null) {
                    return 101;
                }

            }
        }

        /**
         * 格式化当前时间然后获取年龄添加进去
         */

        Integer age = TimeUtitl.getAge(TimeUtitl.parse(tiUsers.getUserBirthday()));
        logger.info("age={}", age);
        if (age == 0) {
            age = 1;
        }

        tiUsers.setUserAge(age);


        Integer updateById = tiUsersMapper.updateById(tiUsers);
        logger.info("updateById={}", updateById);

        TiUsersRoleRef tiUsersRoleRef = new TiUsersRoleRef();
        tiUsersRoleRef.setRoleId(roleId);
        tiUsersRoleRef.setUsersId(tiUsers.getUserId());

        Integer updateRole = tiUsersRoleRefMapper.updateById(tiUsersRoleRef);
        logger.info("updateRole={}", updateRole);
        Subject subject = org.apache.shiro.SecurityUtils.getSubject();
        TiUsers tiUsersSubject = (TiUsers) subject.getPrincipal();
        logger.info("tiUsersSubject= {}",tiUsersSubject);
        tiUsersSubject.setUserAge(age);
        tiUsersSubject.setUserBirthday(tiUsers.getUserBirthday());
        tiUsersSubject.setUserTelephoneNumber(tiUsers.getUserTelephoneNumber());
        tiUsersSubject.setUserEmail(tiUsers.getUserEmail());
        tiUsersSubject.setUserSex(tiUsers.getUserSex());
        tiUsersSubject.setUserNickname(tiUsers.getUserNickname());
        tiUsersSubject.setUserName(tiUsers.getUserName());

        return updateById;
    }

    /**
     * 查询用户信息
     *
     * @param tiUsers
     * @return
     */
    @Override
    public TiUsers queryUserInfo(TiUsers tiUsers) {
        logger.info("tiUsers={}", tiUsers);
        if (tiUsers != null) {
            AbstractWrapper wrapper = new QueryWrapper();
            if (tiUsers.getUserId() != null) {
                wrapper.eq("user_id", tiUsers.getUserId());
                TiUsers selectOne = tiUsersMapper.selectOne(wrapper);
                logger.info("selectOne ={}", selectOne);
                if (selectOne != null) {
                    return selectOne;
                }
            }

        }

        return null;
    }

    /**
     * 修改用户密码
     *
     * @param tiUsers
     * @return
     */
    @Override
    public Integer editUserPwd(TiUsers tiUsers, String formerPwd) {

        if (tiUsers != null) {
            if (tiUsers.getUserId() != null) {
                AbstractWrapper wrapper = new QueryWrapper();
                wrapper.eq("user_id", tiUsers.getUserId());
                TiUsers selectOne = tiUsersMapper.selectOne(wrapper);
                logger.info("selectOne={}", selectOne.getUserPassword());
                logger.info("getSalt={}", selectOne.getSalt());
                if (selectOne != null) {
                    if (SystemUtils.isEmpty(tiUsers.getUserPassword())) {
                        String password = SecurityUtils.encryptPassword(formerPwd, selectOne.getSalt());
                        logger.info("password={}", password);
                        if (!selectOne.getUserPassword().equals(password)) {
                            return 101;
                        }
                    }

                    if (SystemUtils.isEmpty(tiUsers.getUserPassword())) {
                        String salt = SecurityUtils.randomSalt();
                        tiUsers.setSalt(salt);
                        String password = SecurityUtils.encryptPassword(tiUsers.getUserPassword(), salt);
                        tiUsers.setUserPassword(password);
                        Integer updateById = tiUsersMapper.updateById(tiUsers);
                        logger.info("updateById={}", updateById);
                        if (updateById > 0) {
                            return updateById;
                        }
                    }


                }
            }

        }

        return 100;
    }

}
